package socket;

import com.sun.xml.internal.bind.v2.runtime.output.StAXExStreamWriterOutput;
import com.sun.xml.internal.ws.handler.ServerLogicalHandlerTube;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**客户端         *///先开服务端Server 后开客户端client
public class Client {
    /**java.net.Socket:套接字
     * 它封装了TCP协议的通信细节，使用它可以和服务器建立连接并进行交互 */
    private Socket socket  ;  //服务端是总机   客户端是分机 类似电话
     public Client(){
         /**  实例化Socket对象，就是与远端计算机建立连接的过程 需要传入两个对数
          * 1，服务端的IP地址用于找到网络上的计算机
          * 2，服务端口，用于找到服务端计算机上的应用程序*/
         try {
             /**查看IP操作  win+r    cmd   ipconfig          */
             System.out.println("正在连接服务端");
             socket = new Socket("localhost",8099);//先地址后端口      创建Socket对象向服务端发送请求时，会进行三次握手
             System.out.println("服务端连接成功！");
         } catch (IOException e) {
            e.printStackTrace();
         }
     }
    public void start(){
        try {//通过socket获取输出流用于向服务端发送消息  Scoket提供了一个方法，OutputStream getOutputStream() 通过scoket获取输出流，将写出的信息写给服务端
            OutputStream out = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8);
            BufferedWriter bw = new BufferedWriter(osw);
            PrintWriter pw = new PrintWriter(bw,true);//自动行刷新


            Scanner scanner = new Scanner(System.in);
            while(true){
                System.out.println("请输入昵称");
                //要求昵称不能为空或者有空格。如果发生则提示用户并要求重新输入
                String nickname= scanner.nextLine();
                if(nickname.trim().isEmpty()){
                System.out.println("用户名不能为空");
            }else{
                pw.println(nickname);
                    System.out.println("欢迎你"+nickname+"请开始聊天吧"
                  ) ;
                    break;}
            }
            //启动用于读取服务端信息的线程
            ServerHandler  handler  = new ServerHandler();
            Thread t = new Thread(handler);
            //设置为守护线程，这样当主线程结束时，该线程可以一同结束了(因为当前程序没有其他用户线程)
            t.setDaemon(true);
            t.start();
           // Scanner scanner = new Scanner(System.in);
            while(true){
                String line  = scanner.nextLine();
                if("exit".equalsIgnoreCase(line)){
                    break;
                }
                pw.println(line);//发送信息给服务端
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                socket.close();//进行四次挥手
            } catch (IOException e) {
               e.printStackTrace();
            }
        }


     }
     public static void main(String[] args) {
         Client client = new Client();
         client.start();
     }
private  class ServerHandler implements Runnable{
         public void run(){
             try {
                 InputStream in = socket.getInputStream();
                 InputStreamReader isr = new InputStreamReader(in,StandardCharsets.UTF_8);
                 BufferedReader br = new BufferedReader(isr);
                 //循环读取来自服务器发送过来的消息并输出到客户端控制台上
                 String message ;
                 while((message=br.readLine())!=null){
                     System.out.println(message);
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
}





}
